package main

import (
	"fmt"
	"reflect"
)

type User2 struct {
	Name string
	Age  int
	Sex  string
}

func (user User2) Say(msg string) {
	fmt.Println("User说：", msg)
}

func (user User2) PrintInfo() {
	fmt.Printf("名字：%s 年龄：%d 性别%s\n", user.Name, user.Age, user.Sex)
}

func func3(i int, s string) string {
	fmt.Println(i, s)
	return s
}
func main() {

	user := User2{
		Name: "小王",
		Age:  18,
		Sex:  "女",
	}
	value := reflect.ValueOf(user)
	//无参方法的调用
	value.MethodByName("PrintInfo").Call(nil) //用反射得到的对象调用方法

	//有参方法的调用
	args := make([]reflect.Value, 1) //创建一个容量为1的切片
	args[0] = reflect.ValueOf("有参函数的调用来了")
	value.MethodByName("Say").Call(args) //找到对应方法的名字 有参数就在call中加入参数

	//有参有返回值的函数调用
	v3 := reflect.ValueOf(func3)
	args2 := make([]reflect.Value, 2)
	args2[0] = reflect.ValueOf(1)
	args2[1] = reflect.ValueOf("hahhaha")
	result := v3.Call(args2)           //call方法返回的切片  result接收返回值
	fmt.Println(result[0].Interface()) //通过切片下标的interface方法获取值
}
